home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Screenblankers / GBlanker / GSource / Blankers / Worms / blank.c next >
C/C++ Source or Header  |  1996-09-26  |  3KB  |  152 lines

  1. /*
  2.  *    Copyright (c) 1994 Michael D. Bayne.
  3.  *    All rights reserved.
  4.  *
  5.  *    Please see the documentation accompanying the distribution for distribution
  6.  *  and disclaimer information.
  7.  */
  8.  
  9. #include <exec/memory.h>
  10. #include <graphics/gfxmacros.h>
  11. #include <math.h>
  12. #include "/includes.h"
  13.  
  14. typedef struct _Worm
  15. {
  16.     LONG Current;
  17.     LONG X[25];
  18.     LONG Y[25];
  19.     LONG Length;
  20.     LONG Color;
  21.     double Direction;
  22. } Worm;
  23.  
  24. #define ExecBase ( *(( struct Library ** )4L ))
  25.  
  26. LONG BGColor;
  27.  
  28. #define WORMS   0
  29. #define LENGTH  2
  30. #define SCREEN  4
  31. #define FADEPCT 6
  32.  
  33. VOID Defaults( PrefObject *Prefs )
  34. {
  35.     Prefs[WORMS].po_Level = 20;
  36.     Prefs[LENGTH].po_Level = 15;
  37.     Prefs[SCREEN].po_Active = 0;
  38.     Prefs[FADEPCT].po_Level = 0;
  39. }
  40.  
  41. VOID IterateWorm( struct Screen *Scr, Worm *Jim )
  42. {
  43.     LONG x, y, xp, yp;
  44.     double prev;
  45.     struct RastPort *Rast = &Scr->RastPort;
  46.  
  47.     xp = Jim->X[Jim->Current];
  48.     yp = Jim->Y[Jim->Current];
  49.     prev = Jim->Direction;
  50.     
  51.     Jim->Current = ( Jim->Current + 1 ) % Jim->Length;
  52.  
  53.     x = Jim->X[Jim->Current];
  54.     y = Jim->Y[Jim->Current];
  55.  
  56.     SetAPen( Rast, BGColor );
  57.     RectFill( Rast, x-3, y-3, x+2, y+2 );
  58.  
  59.     Jim->Direction = prev + (( double )RangeRand( 100 ) / 100.0 - 0.5 ) * PID2;
  60.     x = xp + ( LONG )( 5.0 * cos( Jim->Direction ));
  61.     y = yp + ( LONG )( 5.0 * sin( Jim->Direction ));
  62.     if(( x < 4 )||( x > Scr->Width-4 ))
  63.         x = xp;
  64.     if(( y < 4 )||( y > Scr->Height-4 ))
  65.         y = yp;
  66.     
  67.     SetAPen( Rast, Jim->Color );
  68.     RectFill( Rast, x-4, y-4, x+3, y+3 );
  69.  
  70.     Jim->X[Jim->Current] = x;
  71.     Jim->Y[Jim->Current] = y;
  72. }
  73.                  
  74. LONG Blank( PrefObject *Prefs )
  75. {
  76.     LONG i, j, nw, RetVal = OK, Colors, ToFrontCount = 0;
  77.     struct Screen *Scr;
  78.     struct Window *Wnd;
  79.     Worm *Worms;
  80.     
  81.     nw = Prefs[WORMS].po_Level;
  82.  
  83.     Scr = cloneTopScreen( FALSE, Prefs[SCREEN].po_Active );
  84.     Worms = AllocVec( sizeof( Worm ) * nw, MEMF_CLEAR );
  85.     
  86.     if( Scr && Worms )
  87.     {
  88.         Colors = 1L << Scr->RastPort.BitMap->Depth;
  89.  
  90.         if( Prefs[FADEPCT].po_Level )
  91.         {
  92.             ULONG *ColorTable, PctCount, BPG;
  93.  
  94.             ColorTable = GetColorTable( Scr );
  95.             BPG = AvgBitsPerGun( getTopScreenMode());
  96.             PctCount = ( 1L << BPG ) * Prefs[FADEPCT].po_Level / 100;
  97.             for( i = 0; i < PctCount; i++ )
  98.                 FadeAndLoadTable( Scr, BPG, ColorTable, 0 );
  99.         }
  100.         
  101.         if( ExecBase->lib_Version < 39 )
  102.         {
  103.             BGColor = 0;
  104.             SetOPen(&( Scr->RastPort ), BGColor );
  105.         }
  106.         else
  107.         {
  108.             BGColor = FindColor( Scr->ViewPort.ColorMap, 0, 0, 0, -1 );
  109.             SetOutlinePen(&( Scr->RastPort ), BGColor );
  110.         }
  111.         
  112.         for( i = 0; i < nw; i++ )
  113.         {
  114.             Worms[i].Color = RangeRand( Colors - 1 ) + 1;
  115.             if( Worms[i].Color == BGColor )
  116.                 Worms[i].Color = ( Worms[i].Color + 1 ) % Colors;
  117.             Worms[i].Length = Prefs[LENGTH].po_Level;
  118.             Worms[i].Direction = ( double )RangeRand( 360 );
  119.             for( j = 0; j < Worms[i].Length; j++ )
  120.             {
  121.                 Worms[i].X[j] = Scr->Width/2;
  122.                 Worms[i].Y[j] = Scr->Height/2;
  123.             }
  124.         }
  125.         
  126.         Wnd = BlankMousePointer( Scr );
  127.         
  128.         while( RetVal == OK )
  129.         {
  130.             for( i = 0; i < nw; i++ )
  131.                 IterateWorm( Scr, &( Worms[i] ));
  132.  
  133.             if(!( ++ToFrontCount % 60 ))
  134.                 ScreenToFront( Scr );
  135.             
  136.             RetVal = ContinueBlanking();
  137.             WaitTOF();
  138.         }
  139.         
  140.         UnblankMousePointer( Wnd );
  141.     }
  142.     else
  143.         RetVal = FAILED;
  144.         
  145.     if( Worms )
  146.         FreeVec( Worms );
  147.     if( Scr )
  148.         CloseScreen( Scr );
  149.  
  150.     return RetVal;
  151. }
  152.